package ar.com.cubika.trainees.bean.transportes;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

import ar.com.cubika.trainees.bean.transportes.actividades.Mantenimiento;
import ar.com.cubika.trainees.bean.transportes.actividades.Viaje;
import ar.com.cubika.trainees.bean.transportes.vehiculos.Vehiculo;
import ar.com.cubika.trainees.dao.ChoferesDAO;

/**
 * @author Carlos
 */
public class Empresa {

	private static Empresa instance;

	public static synchronized Empresa getInstance() {
		return instance;
	}

	public static synchronized void setInstance(Empresa instance) {
		Empresa.instance = instance;
	}

	private static List<Chofer> choferes;
	private Map<String, Vehiculo> vehiculos;
	private String nombre;
	private static ChoferesDAO choferesDAO = ChoferesDAO.getInstance();

	public Empresa() {
		vehiculos = new HashMap<String, Vehiculo>();
		choferes = new ArrayList();
	}

	/**
	 * Devuelve el conjunto de vehiculos que puede hacer un determinado viaje.
	 * 
	 * @param viaje
	 *            el viaje a analizar
	 */
	public Collection vehiculosAptosParaViaje(final Viaje viaje) {
		return CollectionUtils.select(this.getVehiculos(), new Predicate() {
			public boolean evaluate(Object arg0) {
				Vehiculo veh = (Vehiculo) arg0;
				return veh.puedeHacer(viaje);
			}
		});
	}

	/**
	 * los vehiculos de la empresa
	 */
	public Collection<Vehiculo> getVehiculos() {
		return this.vehiculos.values();
	}

	/**
	 * Le agregan un vehiculo a la empresa
	 * 
	 * @param veh
	 *            el vehiculo a agregar
	 */
	public void setVehiculos(Map<String, Vehiculo> vehiculos) {

		this.vehiculos = vehiculos;
	}

	public void addVehiculo(Vehiculo veh) {

		this.vehiculos.put(veh.getPatente(), veh);
	}

	/**
	 * Devuelve el consumo total de los viajes asignados a algun vehiculo,
	 * calculandolo para el vehiculo al que fue asignado el viaje.
	 */
	public double getConsumoTotalViajesAsignados() {
		double total = 0;
		for (Iterator vehIter = this.getVehiculos().iterator(); vehIter
				.hasNext();) {
			Vehiculo veh = (Vehiculo) vehIter.next();
			total += veh.getConsumoTotalViajesAsignados();
		}
		return total;
	}

	public void deleteVehiculo(String patente) {
		this.vehiculos.remove(patente);
	}

	public Vehiculo getVehiculo(String patente) {
		return this.vehiculos.get(patente);
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getNombre() {
		return this.nombre;
	}

	/**
	 * Le agrega un chofer a la empresa
	 * 
	 * @param cho
	 *       chofer a agregar
	 * @return
	 */

	public static synchronized void addChofer(Chofer cho) {
		choferes.add(cho);
	}

	public static synchronized List<Chofer> getChoferes() {
		return choferes;

	}

	public void borrarChofer(String dni) {

		choferesDAO.deleteChofer(dni);
	}

	public static void setChoferes(List<Chofer> choferes) {
		Empresa.choferes = choferes;
	}

	public int getKmBuenosTotales() {

		int total = 0;
		for (Vehiculo vehiculo : vehiculos.values()) {
			total = total + vehiculo.getKmBuenos();
		}

		return total;
	}

	public int getKmMalosTotales() {
		int total = 0;
		for (Vehiculo vehiculo : vehiculos.values()) {
			total = total + vehiculo.getKmMalos();
		}

		return total;
	}

	public int cantidadChoferesDisponibles() {
		int i = 0;
		for(Chofer chofer:choferes){
			
			if (chofer.isDisponible())
				i++;
			
			}
		return i;
	}

//	public Vehiculo getVehiculoMasMantenido() {
//		
//		Vehiculo vehiculoMasMantenido = null;
//		
//		for(Vehiculo vehiculo:vehiculos.values()){
//			
//		int mantenimientos = vehiculo.getMantenimientos().size();
//			
//		if(mantenimientos > vehiculoMasMantenido.getMantenimientos().size())
//			vehiculoMasMantenido = vehiculo;
//
//		}
//		
//		return vehiculoMasMantenido;
//	}

}
